package com.taku.forest.proxy;

import com.dtflys.forest.annotation.Body;
import com.dtflys.forest.annotation.DataVariable;
import com.dtflys.forest.annotation.Query;
import com.dtflys.forest.annotation.Request;
import com.dtflys.forest.http.ForestResponse;

import java.util.Map;


public interface ForestClient {

    @Request(url = "${url}")
    <T> ForestResponse<T> get(@DataVariable("url") String url, Class<T> t);


    @Request(url = "${url}")
    <T> ForestResponse<T> post(@DataVariable("url") String url, @Body Map body ,Class<T> t);


    @Request(url = "${url}")
    <T> ForestResponse<T> getQuery(@DataVariable("url") String url, @Query Map query , Class<T> t);

    /**
     * 模板参数在对应的lifeCycle实现类中进行处理化处理
     * memo @Link(ParameterAnnotationLifeCycle)
     *
     * http请求只是通过 InterfaceProxyHandler 的invoke 方法实现
     * 里面具体的操作是进行query body request 等的封装处理
     * 不同的请求对应不同的HttpExecutor 实现 -> AbstractOkHttp3Executor.execute()
     * 实际的http请求依赖于OkHttp3
     */

    /**
     * 常用注解
     * @DataVariable 重点，用于模板语法的取值，例如动态传入url,被DataVariable修饰的参入可通过${paramName}动态配置大请求路径中,
     *               实际内容不会被发送
     *              例如：
     *              @Get(url = "http://localhost:8080/user/${userId}")
     *  *           UserInfo getUser(@DataVariable("userId") String id);
     *              设id=12则拼接后的 url为 http://localhost:8080/user/12
     *
     *
     * @Query    用于将请求参数拼接在url后面，例如 url?name=taku&age=18
     *          支持Map 和javabean作为入参，处理后未key=value形式
     *          也支持单个入参使用 @Query("userName") String name =>userName=name
     *
     * @header   用于将请求参数作为header添加到请求头中,
     *          支持Map 和javabean作为入参，处理后未key=value形式
     *          也支持单个入参使用 @header("Content-Type") String contentType  => {Content-Type:contentType }
     *
     * @body    用于将请求参数作为post请求的body
     *          支持Map 和javabean作为入参，处理后未key=value形式
     *          也支持单个入参使用 @header("Content-Type") String contentType  => {Content-Type:contentType }
     */
}
